import returnConfig from './config'

class MyRequest {
  constructor() {
    this.default = returnConfig()
  }

  // 添加局部拦截器
  addInterceptors = {
    request: fn => {
      this.default.interceptors.request = fn
    },
    response: fn => {
      this.default.interceptors.response = fn
    }
  }

  /**
   * 添加全局拦截器
   * @param {Object} obj [{}] - 全局拦截器
   * @param {function} obj.request - 全局请求拦截器
   * @param {function} obj.response - 全局响应拦截器
   */
  addGlobalIntercept({ request, response } = {}) {
    this.default.interceptors.global.request = request
    this.default.interceptors.global.response = response
  }

  /**
   * 获取 全局配置
   */
  getConfig() {
    return this.default.config
  }

  /**
   * 设置 全局配置
   * @param {Object} config - 配置数据
   */
  setConfig(config = {}) {
    const defaultConfig = {
      url: '',
      dataType: 'json',
      responseType: 'text'
    }
    
    this.default.config = this.default.merge.globalConfig(defaultConfig, config)
  }

  /**
   * get 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  get(config) {
    const newConfig = this.default.merge.config(config, 'get')

    return this.default.request(newConfig)
  }

  /**
   * post 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  post(config) {
    const newConfig = this.default.merge.config(config, 'post')

    return this.default.request(newConfig)
  }

  /**
   * put 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  put(config) {
    const newConfig = this.default.merge.config(config, 'put')

    return this.default.request(newConfig)
  }

  /**
   * delete 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  delete(config) {
    const newConfig = this.default.merge.config(config, 'delete')

    return this.default.request(newConfig)
  }

  /**
   * connect 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  connect(config) {
    const newConfig = this.default.merge.config(config, 'connect')
    return this.default.request(newConfig)
  }

  /**
   * head 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  head(config) {
    const newConfig = this.default.merge.config(config, 'head')

    return this.default.request(newConfig)
  }

  /**
   * trace 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  trace(config) {
    const newConfig = this.default.merge.config(config, 'trace')

    return this.default.request(newConfig)
  }

  /**
   * options 请求
   * @param {Object} config - 局部配置数据
   * @return {Object|undefined}
   */
  options(config) {
    const newConfig = this.default.merge.config(config, 'options')

    return this.default.request(newConfig)
  }

  /**
   * 停止发送请求
   * @param {Object} obj - request实例对象
   */
  stop(obj) {
    try {
      if (obj.example.abort && typeof obj.example.abort === 'function') {
        obj.example.abort()
      }
    } catch (err) {
      this.default._error(`参数错误, 无法停止发送请求{errmsg: ${JOSN.stringify(err)}}`)
    }
  }
}

export default MyRequest
